/*
 * HTML5 Sortable jQuery Plugin
 * http://farhadi.ir/projects/html5sortable
 * 
 * Copyright 2012, Ali Farhadi
 * Released under the MIT license.
 */
(function($) {
	var dragging, placeholders = $();
	$.fn.sortable = function(options) {
		options = options || {};
		return this.each(function() {
			if (/^enable|disable|destroy$/.test(options)) {
				var items = $(this).children($(this).data('items')).attr('draggable', options == 'enable');
				options == 'destroy' && items.add(this)
					.removeData('connectWith').removeData('items')
					.unbind('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s');
				return;
			}
			var index, items = $(this).children(options.items),
				connectWith = options.connectWith || false;
			var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">');
			var handle = options.handle,
				isHandle;
			items.find(handle).mousedown(function() {
				isHandle = true;
			}).mouseup(function() {
				isHandle = false;
			});
			$(this).data('items', options.items)
			placeholders = placeholders.add(placeholder);
			if (connectWith) {
				$(connectWith).add(this).data('connectWith', connectWith);
			}
			items.attr('draggable', 'true').bind('dragstart.h5s', function(e) {
				if (handle && !isHandle) {
					return false;
				}
				isHandle = false;
				var dt = e.originalEvent.dataTransfer;
				dt.effectAllowed = 'move';
				dt.setData('Text', 'dummy');
				dragging = $(this).addClass('sortable-dragging');
				index = dragging.index();
			}).bind('dragend.h5s', function() {
				if (dragging != null) {
					dragging.removeClass('sortable-dragging').fadeIn();
					placeholders.detach();
					if (index != dragging.index()) {
						items.parent().trigger('sortupdate');
					}
					dragging = null;
				}
			}).not('a[href], img').bind('selectstart.h5s', function() {
				this.dragDrop && this.dragDrop();
				return false;
			}).end().add([this, placeholder]).bind('dragover.h5s dragenter.h5s drop.h5s', function(e) {
				if (!items.is(dragging) && connectWith !== $(dragging).parent().data('connectWith')) {
					return true;
				}
				if (e.type == 'drop') {
					e.stopPropagation();
					placeholders.filter(':visible').after(dragging);
					return false;
				}
				e.preventDefault();
				e.originalEvent.dataTransfer.dropEffect = 'move';
				if (items.is(this)) {
					dragging.hide();
					$(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder);
					placeholders.not(placeholder).detach();
				}
				return false;
			});
		});
	};
})(jQuery);
